using namespace std;

#include <string>
#include <iostream>
#include "RecursoDeAlmacenamiento.h"

RecursoDeAlmacenamiento::RecursoDeAlmacenamiento(){

}

RecursoDeAlmacenamiento::RecursoDeAlmacenamiento(enumIndice estIndice, enumAlmacenamiento estAlmacenamiento, enumRecurso estRecurso, std::string& nombreArchivo, int longitudBuffer, int longitudBloqueIndice, int longitudBloque){

	if(estRecurso == UN_ALMACENAMIENTO){
			cout << "Creando UnAlmacenamiento" << endl;
			this->estrategiaRec = new EstrategiaRecursoUnAlmacenamiento();
	} else if(estRecurso == ESCRITURA_DIRECTA){
			cout << "Creando EscrituraDirecta" << endl;
			this->estrategiaRec = new EstrategiaRecursoEscrituraDirecta();
	/*} else if(estRecurso == ESCRITURA_DIFERIDA){
			EstrategiaRecursoEscrituraDiferida r;
			this->estrategiaRec = &r;*/
	} else {
			this->estrategiaRec = new EstrategiaRecursoUnAlmacenamiento();
	}

	this->nombreArchivo = nombreArchivo;
	this->estrategiaRec->crear(this, estAlmacenamiento, estIndice, longitudBuffer, longitudBloqueIndice, longitudBloque);
}

void RecursoDeAlmacenamiento::almacenar(Registro& registro){
	cout << "Almacenar de recurso" << endl;
	try{
		this->indice->buscar(registro.getValoresClaves());
		throw 0;
	} catch (int){
		this->estrategiaRec->almacenar(this, registro);
	}
}

void RecursoDeAlmacenamiento::borrar(list<string> claves) throw (int){
	int offset;
	
	try{
		offset = this->indice->buscar(claves);
		//se mandan las claves para buscar dentro del bloque.
		this->estrategiaRec->borrar(this, offset, claves);
	} catch (int){
		throw 0;
	}
}

void RecursoDeAlmacenamiento::modificar(Registro& registro){
	int offset;
	
	try{
		offset = this->indice->buscar(registro.getValoresClaves());
		this->estrategiaRec->modificar(this, registro,offset);
	} catch (int){
		throw 0;
	}	
}

Registro RecursoDeAlmacenamiento::buscar(list<string> claves){
	int offset;
	
	try{
		offset = this->indice->buscar(claves);
		return this->estrategiaRec->buscar(this, offset, claves);
	} catch (int){
		throw 0;
	}	
}

void RecursoDeAlmacenamiento::cerrar(){
	this->estrategiaRec->cerrar(this);
}

void RecursoDeAlmacenamiento::imprimirArchivo(){
	this->archivo->imprimir();
}

void RecursoDeAlmacenamiento::imprimirBuffer(){
	if(this->buffer != NULL)
		this->buffer->imprimir();
	else
		cout << "Este archivo no tiene buffer."<<endl;
}

void RecursoDeAlmacenamiento::imprimirIndice(){
	this->indice->imprimir();
}

Archivo* RecursoDeAlmacenamiento::getArchivo(){
	return this->archivo;
}
Buffer* RecursoDeAlmacenamiento::getBuffer(){
	return this->buffer;
}
Indice* RecursoDeAlmacenamiento::getIndice(){
	return this->indice;
}

void RecursoDeAlmacenamiento::setArchivo(Archivo* archivo){
	this->archivo = archivo;
}
void RecursoDeAlmacenamiento::setBuffer(Buffer* buffer){
	this->buffer = buffer;
}
void RecursoDeAlmacenamiento::setIndice(Indice* indice){
	this->indice = indice;
}

string& RecursoDeAlmacenamiento::getNombreArchivo(){
	return this->nombreArchivo;
}
void RecursoDeAlmacenamiento::setNombreArchivo(string nombre){
	this->nombreArchivo = nombre;
}
